home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / tex / td187src.lzh / VARIABLE.I < prev    next >
Text File  |  1991-12-14  |  27KB  |  841 lines

  1. IMPLEMENTATION MODULE Variablen;
  2.  
  3. FROM SYSTEM     IMPORT ADDRESS , ADR;
  4. FROM Storage    IMPORT ALLOCATE , DEALLOCATE;
  5. FROM Diverses   IMPORT round, NumAlert, BlockIntersect;
  6. FROM Types      IMPORT Block, ExtendedArraySize, ObjectPtrTyp,
  7.                        CodeAryTyp, DrawObjectTyp,
  8.                        CharPtrTyp, ExtendedPtrTyp;
  9.  
  10. IMPORT mtAlerts ;
  11. IMPORT mtAppl ;
  12. IMPORT MagicVDI ;
  13. IMPORT MagicAES ;
  14. IMPORT MagicSys ;
  15. IMPORT MagicConvert;
  16. IMPORT CommonData;
  17. IMPORT MagicStrings;
  18. IMPORT MathLib0;
  19. IMPORT RSCindices;
  20.  
  21. (**
  22. IMPORT Debug;
  23. IMPORT RTD;
  24. **)
  25.  
  26.  
  27. CONST Magic = 2905;
  28.  
  29. VAR IgnoreMode : BOOLEAN; (* Falls TRUE wird Aufruf von NewObject ignoriert *)
  30.     zoomit     : BOOLEAN;
  31.     aftstr     : ARRAY [1..5],[0..4] OF ARRAY [0..2] OF CHAR;
  32.     secondadr  : ObjectPtrTyp;
  33.  
  34. PROCEDURE ZoomMode (zoom : BOOLEAN; factor : LONGREAL);
  35. (*
  36.    Schaltet Zoom-Modus an/aus
  37. *)
  38. BEGIN
  39.   zoomit  := zoom;
  40.   zoomfak := factor;
  41. END ZoomMode;
  42.  
  43. PROCEDURE PixDistance(picdist : INTEGER) : INTEGER;
  44. (*
  45.   Rechnet Pixel-Abstände in PIc-Abstände um und umgekehrt
  46. *)
  47. BEGIN
  48.   IF zoomit THEN
  49.     RETURN round(MathLib0.real(picdist) * zoomfak);
  50.    ELSE
  51.     RETURN picdist;
  52.   END;
  53. END PixDistance;
  54.  
  55. PROCEDURE PicDistance(pixdist : INTEGER) : INTEGER;
  56. (*
  57.   Rechnet Pixel-Abstände in PIC-Abstände um
  58. *)
  59. BEGIN
  60.   IF zoomit THEN
  61.     RETURN round(MathLib0.real(pixdist) / zoomfak);
  62.    ELSE
  63.     RETURN pixdist;
  64.   END;
  65. END PicDistance;
  66.  
  67. PROCEDURE PixToPic ( xpix , ypix : INTEGER; VAR xpic , ypic : INTEGER) ;
  68. VAR y : INTEGER ;   (* leider geht y-Achse beim ST von oben nach unten *)
  69. BEGIN
  70.   y := CommonData.OffsetXY[3] ;
  71.   IF zoomit THEN
  72.     xpic   := round( MathLib0.real(xpix - CommonData.WorkArea[0]) /
  73.                      zoomfak);
  74.     xpic   := xpic + CommonData.ZeroX;
  75.     ypic   := round( MathLib0.real(y - ypix + CommonData.WorkArea[1]) /
  76.                      zoomfak );
  77.     ypic   := ypic + CommonData.ZeroY;
  78.    ELSE
  79.     xpic   := xpix -
  80.               CommonData.WorkArea[0] + CommonData.ZeroX;
  81.     ypic   := y - ypix +
  82.               CommonData.WorkArea[1] + CommonData.ZeroY;
  83.   END;
  84. END PixToPic ;
  85.  
  86. PROCEDURE PicToPix (VAR xpix , ypix : INTEGER; xpic , ypic : INTEGER) ;
  87.  
  88. VAR y : INTEGER ;   (* leider geht y-Achse beim ST von oben nach unten *)
  89.  
  90. BEGIN
  91.   y := CommonData.OffsetXY[3] ;
  92.   IF zoomit THEN
  93.     xpix := round( zoomfak *
  94.               MathLib0.real(CommonData.FatherXOffset + xpic
  95.                             - CommonData.ZeroX)) +
  96.               CommonData.WorkArea[0];
  97.     ypix := y - round( zoomfak *
  98.                   MathLib0.real(CommonData.FatherYOffset + ypic
  99.                                 - CommonData.ZeroY)) +
  100.               CommonData.WorkArea[1];
  101.    ELSE
  102.     xpix := (CommonData.FatherXOffset + xpic - CommonData.ZeroX) +
  103.               CommonData.WorkArea[0];
  104.     ypix := y - (CommonData.FatherYOffset + ypic - CommonData.ZeroY) +
  105.               CommonData.WorkArea[1];
  106.   END;
  107. END PicToPix ;
  108.  
  109. PROCEDURE Visible (SurroundRec : ARRAY OF INTEGER) : BOOLEAN ;
  110. (* SurroundRec entspricht Surround in ObjectRecTyp *)
  111. VAR X1, Y1, X2, Y2 : INTEGER;
  112.     temp           : INTEGER;
  113.     result         : BOOLEAN;
  114. BEGIN
  115.   PixToPic (CommonData.ClipXY[0], CommonData.ClipXY[1], X1, Y1);
  116.   PixToPic (CommonData.ClipXY[2], CommonData.ClipXY[3], X2, Y2);
  117.   (* X1,Y1 +--------+        s0,s1 +-------+              *)
  118.   (*       |        |              |       |              *)
  119.   (*       |        |              |       |              *)
  120.   (*       +--------+ X2,Y2        +-------+ s0+s2,s1-s3  *)
  121.   (* Keine X-Überschneidung ? *)
  122.   IF (X1>X2) THEN temp := X2; X2 := X1; X1 := temp; END;
  123.   IF (Y1<Y2) THEN temp := Y2; Y2 := Y1; Y1 := temp; END;
  124.   IF (X2<SurroundRec[0]) OR (X1>SurroundRec[0]+SurroundRec[2]) THEN
  125.     RETURN FALSE;
  126.    ELSE
  127.     (* Keine Y-Überschneidung ? *)
  128.     IF (Y2>SurroundRec[1]) OR (Y1<SurroundRec[1]-SurroundRec[3]) THEN
  129.       RETURN FALSE;
  130.      ELSE
  131.       RETURN TRUE;
  132.     END;
  133.   END;
  134.   RETURN TRUE;
  135. END Visible;
  136.  
  137. VAR strings : ARRAY [1..4] OF ARRAY [1..19] OF CHAR;
  138.     numbers : ARRAY [1..4] OF INTEGER;
  139.  
  140. PROCEDURE Position ( ShowDelta : BOOLEAN;
  141.                      XPos, YPos, XDelta, YDelta : INTEGER ) ;
  142. (*
  143.    Zeigt die momentane Maus-Position (XPos, YPos) an. Ist ShowDelta TRUE,
  144.    so wird zusätzlich noch der Abstand zum Punkt (XDelta,YDelta) angezeigt.
  145. *)
  146. CONST coordlen = 11;
  147.  
  148. VAR str : ARRAY [ 0..9 ] OF CHAR ;
  149.     str2: ARRAY [ 0..9 ] OF CHAR ;
  150.     bdum                 : BITSET;
  151.     xm , ym ,dum , x , y : INTEGER;
  152.     i, deltax, deltay    : INTEGER;
  153.     tree                 : POINTER TO ARRAY [ 0..255 ] OF MagicAES.OBJECT ;
  154.     xmdelta, ymdelta     : INTEGER;
  155.  
  156.   PROCEDURE ChangeNumber(num, index, rscindex : INTEGER);
  157.   VAR txt   : ARRAY [0..127] OF CHAR;
  158.       blank : ARRAY [0..1] OF CHAR;
  159.   BEGIN
  160.     blank := ' ';
  161.     CoordToStr(num, strings[index]);
  162.     WHILE MagicStrings.Length(strings[index])<coordlen DO
  163.       MagicStrings.Insert(blank, strings[index], 0);
  164.     END;
  165.     tree^[rscindex].StringPtr := ADR(strings[index]);
  166.     numbers[index] := num;
  167.   END ChangeNumber;
  168.  
  169.   PROCEDURE ShowNumber(num, x, y : INTEGER);
  170.   VAR txt   : ARRAY [0..127] OF CHAR;
  171.       blank : ARRAY [0..1] OF CHAR;
  172.   BEGIN
  173.     blank := ' ';
  174.     CoordToStr(num, txt);
  175.     WHILE MagicStrings.Length(txt)<coordlen DO
  176.       MagicStrings.Insert(blank, txt, 0);
  177.     END;
  178.     MagicVDI.Text (mtAppl.VDIHandle , x, y, txt);
  179.   END ShowNumber;
  180.  
  181.   PROCEDURE UpdatePosBox;
  182.   CONST DeskWin  = 0 ;
  183.   VAR brec, bvis, bsect, bclip : Block;
  184.   BEGIN
  185.     i := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.REPLACE) ; (* paint *)
  186.     i := MagicVDI.SetTextcolor (mtAppl.VDIHandle , MagicAES.BLACK) ;
  187.     MagicVDI.SetTextalignment (mtAppl.VDIHandle ,
  188.                                 MagicVDI.BaseJust, MagicVDI.BottomJust ,
  189.                                 i , i) ;
  190.     MagicAES.ObjcOffset (tree , RSCindices.posbox , brec.x , brec.y) ;
  191.     brec.y := brec.y + 1; (* oberen Rand schützen *)
  192.     brec.w := tree^ [ RSCindices.posbox ] .obWidth ;
  193.     brec.h := tree^ [ RSCindices.posbox ] .obHeight - 2; (* unteren auch *)
  194.     (* Zuerst holen wir uns mal den sichtbaren Bereich *)
  195.     MagicAES.WindGet(DeskWin, MagicAES.WFFIRSTXYWH, bvis);
  196.     WHILE (bvis.w > 0) AND (bvis.h > 0) DO
  197.       IF BlockIntersect(brec, bvis, bsect) THEN
  198.         bclip.x := bsect.x;
  199.         bclip.y := bsect.y;
  200.         bclip.w := bsect.x + bsect.w - 1;
  201.         bclip.h := bsect.y + bsect.h - 1;
  202.         MagicVDI.SetClipping (mtAppl.VDIHandle  , bclip , TRUE) ;
  203.         ShowNumber(deltax, CommonData.DXPosx , CommonData.DXPosy+2);
  204.         ShowNumber(xm    , CommonData.XPosx , CommonData.XPosy+2);
  205.         ShowNumber(deltay, CommonData.DYPosx , CommonData.DYPosy+2);
  206.         ShowNumber(ym    , CommonData.YPosx , CommonData.YPosy+2);
  207.         MagicVDI.SetClipping (mtAppl.VDIHandle  , bclip , FALSE) ;
  208. (**
  209.         MagicAES.ObjcDraw (tree , 0 , 9 , bsect);
  210. **)
  211.       END ;
  212.       MagicAES.WindGet(DeskWin, MagicAES.WFNEXTXYWH, bvis);
  213.     END ;
  214.     MagicVDI.SetTextalignment (mtAppl.VDIHandle ,
  215.                                 MagicVDI.BaseJust, MagicVDI.BaseJust,
  216.                                 i , i) ;
  217.   END UpdatePosBox;
  218.  
  219. BEGIN
  220.   tree := MagicAES.RsrcGaddr(MagicAES.RTREE , RSCindices.desktop) ;
  221.   x := XDelta; y := YDelta;
  222.   IF x < CommonData.WorkArea [ 0 ] THEN x := CommonData.WorkArea [ 0 ] END;
  223.   IF x > CommonData.WorkArea [ 2 ] THEN x := CommonData.WorkArea [ 2 ] END;
  224.   IF y < CommonData.WorkArea [ 1 ] THEN y := CommonData.WorkArea [ 1 ] END;
  225.   IF y > CommonData.WorkArea [ 3 ] THEN y := CommonData.WorkArea [ 3 ] END;
  226.   IF ShowDelta THEN
  227.     PixToPic (x , y , xmdelta , ymdelta) ;
  228.   END;
  229.   dum := MagicVDI.SetTextcolor (mtAppl.VDIHandle , MagicAES.BLACK) ;
  230.   x := XPos;
  231.   y := YPos;
  232.   IF x < CommonData.WorkArea [ 0 ] THEN x := CommonData.WorkArea [ 0 ] END;
  233.   IF x > CommonData.WorkArea [ 2 ] THEN x := CommonData.WorkArea [ 2 ] END;
  234.   IF y < CommonData.WorkArea [ 1 ] THEN y := CommonData.WorkArea [ 1 ] END;
  235.   IF y > CommonData.WorkArea [ 3 ] THEN y := CommonData.WorkArea [ 3 ] EN